package edu.njucm.herbiv.utils

import java.io.File
import java.io.IOException
import java.nio.file.Files
import java.nio.file.Paths

/**
 * @Author ZhouHang
 * @Date 24/5/17 周五
 */
object FileUtils {
    const val RESULTSNAME = "results.json"
    const val NETWORKNAME = "Network.csv"
    const val TYPENAME = "Type.csv"
    const val GRAPHNAME = "Graph.html"

    /**
     * 读取文件所有内容, 读取失败则返回空字符串
     */
    fun readAll(filePath: String): String {
        var ret = ""
        try {
            ret = Files.readString(Paths.get(filePath))
        } catch (e: IOException) {
            return ""
        }
        return ret
    }

    /**
     * 将内容写入文件中
     * @param filePath 待写入的文件
     * @param content 待写入的内容
     * */
    fun writeAll(filePath: String, content: String) {
        val file = File(filePath)
        file.writeText(content)
    }

    /**
     * 删除文件
     * @param filePath 待删除的文件路径
     */
    private fun deleteFile(filePath: String): Boolean {
        val file = File(filePath)
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        return if (file.exists() && file.isFile) {
            file.delete()
        } else {
            false
        }
    }

    /**
     * 删除整个文件夹
     * @param directoryPath 待删除的文件夹路径
     */
    fun deleteDirectory(directoryPath: String): Boolean {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        var directoryPathNew = directoryPath
        if (!directoryPath.endsWith(File.separator))
            directoryPathNew = directoryPath + File.separator
        val dirFile = File(directoryPathNew)
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory)) {
            return false
        }
        var flag = true
        // 删除文件夹中的所有文件包括子目录
        val files = dirFile.listFiles()
        if (files != null) {
            for (file in files) {
                // 删除子文件
                if (file.isFile) {
                    flag = deleteFile(file.absolutePath)
                    if (!flag) break
                } else if (file.isDirectory) {
                    flag = deleteDirectory(file.absolutePath)
                    if (!flag) break
                }
            }
        }
        if (!flag) {
            return false
        }
        return dirFile.delete()
    }
}